今天要講的是關於tf中的frame,其實frame這個東西不管哪個topic都用得到,只要有加上header都會有一個屬性是frame,並且可以在rviz上切換不同的frame進行圖層的切換,那麼frame到底怎麼解釋呢?
frame可以解釋為一個座標系統,像之前的小烏龜範例,/turtle1和/turtle2分屬兩個座標系統,而可以透過tf將兩個座標系投影在world frame上,也就是將本來在/turtle1和/turtle2的區域座標轉換成世界座標,讓兩者可以相互參照。
tf可以用來定義不同的區域座標,以及不同區域座標之間的連結,以上圖為例,tf可以建立/turtle1和/world之間的連結,也可以建立/turtle1和/carrot1的,tf使用的是樹狀結構,這表示一個frame只會有一個parent,但可以有很多個children。
範例code:
#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
int main(int argc, char** argv){
ros::init(argc, argv, "my_tf_broadcaster");
ros::NodeHandle node;
tf::TransformBroadcaster br;
tf::Transform transform;
ros::Rate rate(10.0);
while (node.ok()){
transform.setOrigin( tf::Vector3(0.0, 2.0, 0.0) );
transform.setRotation( tf::Quaternion(0, 0, 0, 1) );
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "turtle1", "carrot1"));
rate.sleep();
}
return 0;
};
其中最重要的部份:
transform.setOrigin( tf::Vector3(0.0, 2.0, 0.0) );
transform.setRotation( tf::Quaternion(0, 0, 0, 1) );
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "turtle1", "carrot1"));
建立一個新的frame名稱carrot1,對應到turtle1距離2公尺的偏移量。
https://answers.ros.org/question/210572/what-is-a-frame/
http://wiki.ros.org/tf/Tutorials/Adding%20a%20frame%20%28C%2B%2B%29